package com.qingxin.sys.filter;

import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.catalina.util.ParameterMap;

/**
 * 该类提供GET请求参数的编码功能<br>
 * 供RequestEncodingFilter使用。  <br>
 * 作用是转换一个HttpServletRequest，转换其取得参数的函数，避免出现乱码
 */
public class RequestEncodingWrapper extends HttpServletRequestWrapper {
	protected String encoding = null;//字符编码
	protected ParameterMap<String, String[]> parameterMap = null;//所有参数
	
	/**
	 * 默认使用UTF-8
	 * 
	 * @param request
	 */
	public RequestEncodingWrapper(HttpServletRequest request) {
		this(request, "UTF-8");
	}
	
	/**
	 * 指定编码
	 * 
	 * @param request
	 * @param encoding
	 */
	public RequestEncodingWrapper(HttpServletRequest request, String encoding) {
        super(request);
        this.encoding = encoding;
        if(encoding==null || encoding.trim().length()==0){
        	this.encoding = null;
        }
    }
	
	/**
	 * 获取编码的字符串
	 * 
	 * @param value
	 * @return
	 */
	protected String getEncodedString(String value) {
		if(value==null){
			return null;
		}
		try {
			return new String(value.getBytes("ISO8859-1"), encoding);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return value;
	}
	
	/**
	 * 获取编码的参数值
	 * 
	 * @param name 参数名
	 * @return
	 */
	@Override
	public String getParameter(String name) {
		if(encoding==null){
			return getRequest().getParameter(name);
		}
		if(parameterMap==null){
			getParameterMap();
		}
		if(parameterMap==null){
			return null;
		}
		String[] values = (String[]) parameterMap.get(name);
		if(values!=null && values.length>0){
			return values[0];
		}
		return null;
	}
	
	/**
	 * 获取编码的所有参数的不可变MAP对象<br>
	 * key : 参数名<br>
	 * value : 参数值数组<br>
	 * 
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	@Override
	public Map<String, String[]> getParameterMap() {
		if(encoding==null){
			return getRequest().getParameterMap();
		}
		if(parameterMap!=null){
			return parameterMap;
		}
		Map origMap = getRequest().getParameterMap();
		parameterMap = new ParameterMap<String, String[]>();
		if (origMap != null){
			Iterator it = origMap.keySet().iterator();
			while (it.hasNext()){
				String key = (String) it.next();
				String[] values = (String[]) origMap.get(key);
				if(values!=null){
					for(int i=0; i<values.length; i++){
						values[i] = getEncodedString(values[i]);
					}
				}
				parameterMap.put(getEncodedString(key), values);
			}
		}else {
			return null;
		}
		parameterMap.setLocked(true);
		return parameterMap;
	}
	
	/**
	 * 获取编码的参数值数组
	 * 
	 * @param name 参数名
	 * @return
	 */
	@Override
	public String[] getParameterValues(String name) {
		if(encoding==null){
			return getRequest().getParameterValues(name);
		}
		if(parameterMap==null){
			getParameterMap();
		}
		if(parameterMap==null){
			return null;
		}
		return (String[]) parameterMap.get(name);
	}

	/**
	 * 获取编码的所有的参数名的枚举
	 * 
	 * @return
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public Enumeration getParameterNames() {
		if(encoding==null){
			return getRequest().getParameterNames();
		}
		if(parameterMap==null){
			getParameterMap();
		}
		if(parameterMap==null){
			return null;
		}
		return new Vector(parameterMap.keySet()).elements();
	}
	
}
